task-stash の 開発ログ
from task-stash
task-stashの開発ログ
以下のナンバリングは、挿入や削除が起きても変化させない。
Ctrl + Fですぐ検索できるようにしておく。
英語名は記憶に定着させやすくするため
ナンバリングだけだとわかりにくい
仕様番号の工夫
定義のところには)を付記してあるので、定義を参照したければ英語名+)で検索をかける
一意なIDを維持するため
1. task-stashの技術的仕様
要求
i with-ease)
ユーザーは自分の思ったことを思考停止状態でもすぐに書き出して保管できる。
めんどくささよりも書くことが勝つのが望ましい
自分を怠惰として計画を立てる
なので、ものすごく空欄のある テンプレート を埋めることが強制されると、やる気がある時以外はそれを起動すること自体が億劫になる
必須事項の書くべきことはできるだけ少なくしたい
ii imoduru)
そこから書きたいことが芋づる式に思いついたら、それを受け止める場がある。
書くべきことを少なくしただけだと、初めに書いた後に書きたいことが湧き上がっても書けなくなる。
与える情報量は多ければ多いほどいいので、そういうやる気がある時はそれを受け入れたい
幅を持たせる必要がある
iii memento)
通知以外の方法で、過去に保管した内容をほどほどに目に入れることができる。
iv enough-info)
未来の自分から見て、思ったことに対して誤解しない程度の情報量を含んでいる
タイトルと質問一つを一文で投げかける程度で良い
要求しないこと
GUI
自分が触れるプロトタイプだけがまずは欲しい。
そこからさらに開発を進めていく
incremental(インクリメンタル)な開発
UP開発的か?
時間計算量 / 空間計算量の最適性
すごく愚直なコードでもコピーが大量発生しようが、$ O(n!)だろうがいいのでとりあえず作る
プロトタイプは汚く、本番はプロトタイプを躊躇なく捨て全てを書き直せ?
触れることができて初めてコメントが出せるが、触れられなければコメントは出せない
いや、$ O(n!)は困るかも....
いずれにせよ、$ nは十分に小さいものとみなして良い
マルチプラットフォーム
とりあえずまずは使ってみたい
外部仕様
1: append)
アプリケーションは以下の挙動を踏む
1-1: args)
/icons/pass.iconアプリはこのような引数を取り起動する
$ scrap-stash push "title"
/icons/pass.icon1-1-2: scrapbox)
-s "project"コマンド: Scrapboxで専用のプロジェクトページを開く
1-1-3: default project)
デフォルトプロジェクトを設定できる
1-1-5: template)
そのさいに、プロジェクトテンプレートを反映しておく。
最初はテンプレートデータは直書きでかまわない
1-1-4: alias) (optional)
エイリアスを設定できる
もっと利用頻度が高い場合は$ alias ssp=scrap-stash pushとでもすればよい
1-2: no -s behaviour)
-sが設定されていない限り、次の質問を問う
1-2-1: background)
? background: で、一文で背景を標準入力から説明する。
1-2-2: want)
できるだけ手間を減らしたい(titleに何がやりたいかは書かれるはず)
? want: で、一文で解決したいことを説明する。
1-2-3: expected)
? expected: で、一文で解決したいことを説明する。
1-3: read and history)
過去に追記した五件のプロジェクトを表示する
IDがついている
要件mementoの達成のため。
1-4: save)
データを蓄積し、ファイルに出力する
保存されるデータの基本単位は次の型を満たす
code:typescript
{
id: string;
date: string;
title: string;
background: string;
want: string;
expected: string;
scrapbox_url: string;
}
過去に貯蓄していたデータの上にさらに積み上げる。
スタック形式
タスクには一意なIDがつけられる。
プロトタイプでは通し番号で良い
プロトタイプではjsonで保存して良い
配列で保存しても良い
1-5: finished)
終了する
2: delete)
タスクの削除動作
アプリケーションは以下の挙動を踏む
2-1: args)
アプリはこのような引数を取り起動する
$ scrap-stash pop ${number}
-p: pop
引数がなければ、一番上のものが取り出される
2-2: check)
上にタスク概要を表示しながら、以下を表示し、標準入力を受け取る
delete? [yN]
y|N以外だったら実行を一旦停止する。
2-3: clean-up)
2-3-1 process) 保存しているデータベースからデータを削除する。
2-3-2 finish-display) データを削除したら、なんらかのレスポンスを返し終了する。
2-3-3 record-scrapbox) (option) scrapboxに削除したタスクを記録しておく。
デフォルトタスクについて記録が行われるのが望ましい
3: dump)
$ scrap-stash dump
すべてのタスクのidとタイトルを最大百件表示する
表示形式は問わない。
ただし、各項目については改行を挟んで、どこからがアイテムの開始点かがわかりやすいのが望ましい
4: detail)
$ scrap-stash detail {id}
idに対応するタスクの詳細を表示する
表示形態は問わない。
2. 開発環境
CLIアプリとして実装
Rust
Serializeが利用できる
プロトタイプとして開発するにあたっては書き込みのあれこれを考えなくてもいい
ドッグフーディングがすぐできる
これがでかい
clapが利用できる
Cliアプリを開発しやすい
適当に思い通りに書き散らしても、コンパイラのエラーに従ってさえいればうまく動いてくれることが多い
少なくともメモリに関するエラーはほとんど防がれる
C++でバグ取りに沼るのは大抵そこ。
そこのエラー検出力が強いので、安心してコードが書ける
自分の理想をあっさりと実現しやすいので、プロトタイプにはもってこい
ドキュメント
homework-priorityのCLIアプリの開発前例あり
今回の機能は、この開発事例で使用したもので全て賄える。
NeoVim
慣れるため
/icons/pass.icon- 18:00 1-1:args) を実装する
https://github.com/nvim-tree/nvim-tree.lua
C-w + hlで分割を跨いでカーソル切り替え
(自分で設定) option + nでタブ切り替え
dw ワード削除
b 前の単語に移動
^ インデントを考慮した行頭
https://motamemo.com/vim/vim-tips/indent-left-right/
>>ですでに入力されている行に対してインデントを入れる。
clap の tutorial
clapにおける サブコマンド
いけたわ
https://scrapbox.io/files/652a574f4e32e1001b708f76.png
/icons/pass.icon1-1-2 scrapboxの実装
openコマンド使えばええかな
端末によってブラウザ開くコマンドが違いそう
それ専用のクレートとかあったりするんだろうか
Rustからブラウザを開く: WebでRustを動かす方法が大半
rust-headless-chromeはprivateプロジェクトに書けなくなるので今回は使わない
英語で調べてみよう
ファイルの追加
https://github.com/nvim-tree/nvim-tree.lua
:e使った方が早いか
std::error::Error
https://qiita.com/fujitayy/items/cafe661415b6aa33d884
openコマンドの実行
子プロセス https://doc.rust-jp.rs/rust-by-example-ja/std_misc/process.html
ファイルの階層構造 https://doc.rust-jp.rs/rust-by-example-ja/mod/split.html
いけた!
https://scrapbox.io/files/652d00eb093f40001c7fccde.png
1-1-3: default project
clapの仕様
-sが指定されていて入力がない状態(デフォルト) ---> 文字列でくる
-sが指定されている状態 ---> 文字列でくる
-sが指定されていないとき ---> 値なし
urlの受け取りはOptionでいい感じだ
ライフタイム指定子